﻿// -----------------------------------------------------------------------
// <copyright file="Utiles.cs" company="Hexacta S.A.">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace generador
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Collections;
    using gudusoft.gsqlparser;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public static class Utiles
    {

        public static Random random= new Random();

        public static DataTable ElegirTablaAlAzar(DataSet ds)
        {
            int index = random.Next(ds.Tables.Count);
            return ds.Tables[index];
        }

        public static DataColumn ElegirCampoAlAzar(DataTable dt)
        {
            int index = random.Next(dt.Columns.Count);
            return dt.Columns[index];
        }

        //pre:  campos_posibles.Count>0
        public static T ElegirElementoAlAzar<T>(IList<T> campos_posibles)
        {
            int index = random.Next(campos_posibles.Count);
            return campos_posibles[index];
        }

        public static DataTable ElegirTablaAlAzarDistintaDe(DataSet ds, DataTable tabla_elegida)
        {

            IList<DataTable> lista = ConvertirAIListFromDataTableCollection(ds.Tables);
            if(lista.Count<2)
                throw new Exception("No se puede elegir uno distinto porque no hay mas");
            lista.Remove(tabla_elegida);
            DataTable dt = ElegirElementoAlAzar(lista);
            return dt;
        }

        public static IList<DataColumn> ConvertirAIListFromDataColumnCollection(DataColumnCollection dcc)
        {
            List<DataColumn> lista = new List<DataColumn>();
            for (int i = 0; i < dcc.Count; i++)
			{
			    lista.Add(dcc[i]);
			}
            return lista;
        }


        public static IList<DataTable> ConvertirAIListFromDataTableCollection(DataTableCollection dtc)
        {
            List<DataTable> lista = new List<DataTable>();
            for (int i = 0; i < dtc.Count; i++)
            {
                lista.Add(dtc[i]);
            }
            return lista;
        }

        public static void ImprimirIListDeDatacolumn(IList<DataColumn> dcl)
        {
            Console.WriteLine("");
            foreach (DataColumn dc in dcl)
            {
                Console.Write(dc.ColumnName + ", ");
            }
        
        }

        public static bool RandomEntreTrueYFalse()
        {
            int nro = random.Next(2);
            if (nro == 0)
                return false;
            else
                return true;
        }


        public static List<string> DameOperadoresAritmeticos()
        {
            List<string> operadores = new List<string>();
            operadores.Add("=");
            operadores.Add(">=");
            operadores.Add("<=");
            operadores.Add("!=");
            operadores.Add("!<");
            operadores.Add("!>");
            operadores.Add("<");
            operadores.Add(">");

            return operadores;
        }

        public static TLzCustomExpression GenerarExpresionWhereRecursivamente(IList<DataColumn> columnas_posibles, TLzCustomExpression where, int cantidad_binarias)
        {
            if (cantidad_binarias == 0)//caso base
            {
                return GenerarExprFinalRandom(columnas_posibles);
            }
            else
            {

                TLzCustomExpression expr1 = new TLzCustomExpression(null);
                expr1.oper = TLzOpType.Expr_AND;

                expr1.lexpr = GenerarExprFinalRandom(columnas_posibles);

                expr1.rexpr = GenerarExpresionWhereRecursivamente(columnas_posibles, expr1, cantidad_binarias - 1);

                return expr1;
            }
        }

        private static TLzCustomExpression GenerarExprFinalRandom(IList<DataColumn> columnas_posibles)
        {
            DataColumn col = Utiles.ElegirElementoAlAzar<DataColumn>(columnas_posibles);
            List<string> operadores = Utiles.DameOperadoresAritmeticos();
            string operador = Utiles.ElegirElementoAlAzar<string>(operadores);
            string resultado = col.ColumnName + " " + operador + " " + Utiles.random.Next(60);  //NO CHEQUEO TIPOS A TODO LE MANDO INT
            return new TLzCustomExpression(null, TDbVendor.DbVMssql, resultado);
        }


    }
}
